ClutterActor *from,
StDirectionType direction);
+static void check_pseudo_class (StWidget *widget);
+static void check_labels (StWidget *widget);
+
static void
st_widget_update_insensitive (StWidget *widget)
{
{
st_widget_style_changed (actor);
g_object_notify_by_pspec (G_OBJECT (actor), props[PROP_PSEUDO_CLASS]);
+ check_pseudo_class (actor);
}
}
{
st_widget_style_changed (actor);
g_object_notify_by_pspec (G_OBJECT (actor), props[PROP_PSEUDO_CLASS]);
+ check_pseudo_class (actor);
}
}
{
st_widget_style_changed (actor);
g_object_notify_by_pspec (G_OBJECT (actor), props[PROP_PSEUDO_CLASS]);
+ check_pseudo_class (actor);
}
}
gboolean can_focus)
{
StWidgetPrivate *priv;
+ AtkObject *accessible;
g_return_if_fail (ST_IS_WIDGET (widget));
if (priv->can_focus != can_focus)
{
priv->can_focus = can_focus;
+ accessible = clutter_actor_get_accessible (CLUTTER_ACTOR (widget));
g_object_notify_by_pspec (G_OBJECT (widget), props[PROP_CAN_FOCUS]);
+
+ if (accessible)
+ atk_object_notify_state_change (accessible,
+ ATK_STATE_FOCUSABLE,
+ priv->can_focus);
}
}
priv->label_actor = NULL;
g_object_notify_by_pspec (G_OBJECT (widget), props[PROP_LABEL_ACTOR]);
+ check_labels (widget);
}
}
static void st_widget_accessible_initialize (AtkObject *obj,
gpointer data);
-/* Private methods */
-static void on_pseudo_class_notify (GObject *gobject,
- GParamSpec *pspec,
- gpointer data);
-static void on_can_focus_notify (GObject *gobject,
- GParamSpec *pspec,
- gpointer data);
-static void on_label_notify (GObject *gobject,
- GParamSpec *pspec,
- gpointer data);
-static void check_pseudo_class (StWidgetAccessible *self,
- StWidget *widget);
-static void check_labels (StWidgetAccessible *self,
- StWidget *widget);
-
struct _StWidgetAccessiblePrivate
{
/* Cached values (used to avoid extra notifications) */
{
ATK_OBJECT_CLASS (st_widget_accessible_parent_class)->initialize (obj, data);
- g_signal_connect (data, "notify::pseudo-class",
- G_CALLBACK (on_pseudo_class_notify),
- obj);
-
- g_signal_connect (data, "notify::can-focus",
- G_CALLBACK (on_can_focus_notify),
- obj);
-
- g_signal_connect (data, "notify::label-actor",
- G_CALLBACK (on_label_notify),
- obj);
-
/* Check the cached selected state and notify the first selection.
* Ie: it is required to ensure a first notification when Alt+Tab
* popup appears
*/
- check_pseudo_class (ST_WIDGET_ACCESSIBLE (obj), ST_WIDGET (data));
- check_labels (ST_WIDGET_ACCESSIBLE (obj), ST_WIDGET (data));
+ check_pseudo_class (ST_WIDGET (data));
+ check_labels (ST_WIDGET (data));
}
static AtkStateSet *
return result;
}
-static void
-on_pseudo_class_notify (GObject *gobject,
- GParamSpec *pspec,
- gpointer data)
-{
- check_pseudo_class (ST_WIDGET_ACCESSIBLE (data),
- ST_WIDGET (gobject));
-}
-
/*
* In some cases the only way to check some states are checking the
* pseudo-class. Like if the object is selected (see bug 637830) or if
* if required.
*/
static void
-check_pseudo_class (StWidgetAccessible *self,
- StWidget *widget)
+check_pseudo_class (StWidget *widget)
{
gboolean found = FALSE;
+ AtkObject *accessible =
+ clutter_actor_get_accessible (CLUTTER_ACTOR (widget));
+ StWidgetAccessiblePrivate *priv;
+
+ if (!accessible)
+ return;
+ priv = ST_WIDGET_ACCESSIBLE (accessible)->priv;
found = st_widget_has_style_pseudo_class (widget,
"selected");
- if (found != self->priv->selected)
+ if (found != priv->selected)
{
- self->priv->selected = found;
- atk_object_notify_state_change (ATK_OBJECT (self),
+ priv->selected = found;
+ atk_object_notify_state_change (accessible,
ATK_STATE_SELECTED,
found);
}
found = st_widget_has_style_pseudo_class (widget,
"checked");
- if (found != self->priv->checked)
+ if (found != priv->checked)
{
- self->priv->checked = found;
- atk_object_notify_state_change (ATK_OBJECT (self),
+ priv->checked = found;
+ atk_object_notify_state_change (accessible,
ATK_STATE_CHECKED,
found);
}
}
static void
-on_can_focus_notify (GObject *gobject,
- GParamSpec *pspec,
- gpointer data)
-{
- gboolean can_focus = st_widget_get_can_focus (ST_WIDGET (gobject));
-
- atk_object_notify_state_change (ATK_OBJECT (data),
- ATK_STATE_FOCUSABLE, can_focus);
-}
-
-static void
-on_label_notify (GObject *gobject,
- GParamSpec *pspec,
- gpointer data)
-{
- check_labels (ST_WIDGET_ACCESSIBLE (data), ST_WIDGET (gobject));
-}
-
-static void
-check_labels (StWidgetAccessible *widget_accessible,
- StWidget *widget)
+check_labels (StWidget *widget)
{
+ AtkObject *accessible =
+ clutter_actor_get_accessible (CLUTTER_ACTOR (widget));
+ StWidgetAccessiblePrivate *priv;
ClutterActor *label = NULL;
AtkObject *label_accessible = NULL;
+ if (!accessible)
+ return;
+
+ priv = ST_WIDGET_ACCESSIBLE (accessible)->priv;
+
/* We only call this method at startup, and when the label changes,
* so it is fine to remove the previous relationships if we have the
* current_label by default
*/
- if (widget_accessible->priv->current_label != NULL)
+ if (priv->current_label != NULL)
{
- AtkObject *previous_label = widget_accessible->priv->current_label;
+ AtkObject *previous_label = priv->current_label;
- atk_object_remove_relationship (ATK_OBJECT (widget_accessible),
+ atk_object_remove_relationship (accessible,
ATK_RELATION_LABELLED_BY,
previous_label);
atk_object_remove_relationship (previous_label,
ATK_RELATION_LABEL_FOR,
- ATK_OBJECT (widget_accessible));
+ accessible);
g_object_unref (previous_label);
}
label = st_widget_get_label_actor (widget);
if (label == NULL)
{
- widget_accessible->priv->current_label = NULL;
+ priv->current_label = NULL;
}
else
{
label_accessible = clutter_actor_get_accessible (label);
- widget_accessible->priv->current_label = g_object_ref (label_accessible);
+ priv->current_label = g_object_ref (label_accessible);
- atk_object_add_relationship (ATK_OBJECT (widget_accessible),
+ atk_object_add_relationship (accessible,
ATK_RELATION_LABELLED_BY,
label_accessible);
atk_object_add_relationship (label_accessible,
ATK_RELATION_LABEL_FOR,
- ATK_OBJECT (widget_accessible));
+ accessible);
}
}